package clases;

import Util.EnviarMail;
import Util.UtilFecha;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import clases.*;
import persistencia.*;

/**
 *
 * @author JAVA
 */
public class Usuario {

    // Constantes
    public static final int MAX_INVITACIONES = 10; // Numero maximo de invitaciones permitidas por defecto

    // Enumeraciones
    public enum Sexo {

        HOMBRE, MUJER
    };

    public enum Perfil {

        PUBLICO, PRIVADO;
    }
    // Atributos
    private int idUsuario;
    private String usuario; //nick
    private String contrasenya;
    private String nombre;
    private String apellidos;
    private String email;
    private String poblacion;
    private String provincia;
    private String descripcion;
    private String tipo; // Estado: Alta o Baja
    private String perfil;// Publico o Privado
    private String lema;
    private Date fechaNacimiento;
    private Date fechaAlta;
    private Date fechaBaja;
    private String sexo;
    private Collection<Invitacion> invitaciones; // Máximo MAX_INVITACIONES invitaciones por defecto
    private Collection<Relacion> relaciones;
    private List<Mensaje> misMensajes;
    private Collection<Mensaje> favoritos;
    private Collection<SolicitudAmistad> solicitudesAmistadEnviadas = new ArrayList();
    private Collection<SolicitudAmistad> solicitudesAmistadRecibidas = new ArrayList();

    // Constructores
    public Usuario(String nick, int idUsuario, String nombre, String apellidos, String email, String poblacion, String provincia, String descripcionPersonal, String tipoPerfil,
            String contrasenya, String estado, Date fechaA, Date fechaB, String lema, String sexo, Date fechaNac) {
        this.usuario = nick;
        this.idUsuario = idUsuario;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.email = email;
        this.poblacion = poblacion;
        this.provincia = provincia;
        this.descripcion = descripcionPersonal;
        this.perfil = tipoPerfil;
        this.contrasenya = contrasenya;
        this.tipo = estado;
        this.fechaAlta = fechaA;
        this.fechaNacimiento = fechaNac;
        this.fechaBaja = fechaB;
        this.lema = lema;
        this.sexo = sexo;
    }

    public Usuario() {
    }

    public Usuario(String nickUsuario,
            int idUsuario,
            String nombre,
            String apellidos,
            String email,
            String poblacion,
            String provincia,
            String descripcionPersonal,
            String tipoPerfil,
            String miestado,
            String contrasenya,
            Date fechaalta,
            Date fechabaja,
            Set<Invitacion> invitaciones,
            String lema,
            String sexo,
            Date fechaNacimiento) {

        this.usuario = nickUsuario;
        this.idUsuario = idUsuario;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.email = email;
        this.poblacion = poblacion;
        this.provincia = provincia;
        this.descripcion = descripcionPersonal;
        this.perfil = tipoPerfil;
        this.tipo = miestado;
        this.contrasenya = contrasenya;
        this.fechaAlta = fechaalta;
        this.fechaBaja = fechabaja;
        this.invitaciones = invitaciones;
        this.lema = lema;
        this.sexo = sexo;
        this.fechaNacimiento = fechaNacimiento;
    }

    /*Constructor Miguel inicio*/
    public Usuario(String usuario, String contrasenya, String nombre, String apellidos, String email,
            String poblacion, String provincia, String descripcion,
            String perfil, Date fechaNacimiento, String sexo) {

        long fechaIni = System.currentTimeMillis();//guardamos fecha actual como fecha de alta usuario
        this.usuario = usuario;
        this.contrasenya = contrasenya;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.email = email;
        this.poblacion = poblacion;
        this.provincia = provincia;
        this.descripcion = descripcion;
        this.tipo = "alta";
        this.perfil = perfil; // Público / privado
        this.fechaNacimiento = fechaNacimiento;
        this.fechaAlta = new Date(fechaIni);
        this.sexo = sexo;

    }

    /*constructor para alta NO MODIFICAR!*/
    public Usuario(String nombre, String apellidos, String usuario, String email,
            String poblacion, String provincia, String descripcion, String contrasenya,
            String perfil, String sexo, Date fechaNacimiento, String lema) {

        long fechaIni = System.currentTimeMillis();//guardamos fecha actual como fecha de alta usuario
        this.usuario = usuario;
        this.contrasenya = contrasenya;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.email = email;
        this.poblacion = poblacion;
        this.provincia = provincia;
        this.descripcion = descripcion;
        this.tipo = "alta";
        this.perfil = perfil; // Público / privado
        this.fechaNacimiento = fechaNacimiento;
        this.fechaAlta = new Date(fechaIni);
        this.fechaBaja = new Date(0);
        this.sexo = sexo;
        this.lema = lema;

    }

    public void armarUsuario() {
        this.cargarMensajes();
        this.cargarRelaciones();
        this.cargarInvitaciones();
        this.cargarSolicitudesAmistadEnviadas();
        this.cargarSolicitudesAmistadRecibidas();
        // Añadir cargar lema
    }

    public Collection<Mensaje> getFavoritos() {
        return favoritos;
    }

    public void setFavoritos(Set<Mensaje> favoritos) {
        this.favoritos = favoritos;
    }

    public Collection<Invitacion> getInvitaciones() {
        return invitaciones;
    }

    public void setInvitaciones(Collection<Invitacion> invitaciones) {
        this.invitaciones = invitaciones;
    }

    public Collection<Mensaje> getMisMensajes() {
        return misMensajes;
    }

    public void setMisMensajes(List misMensajes) {
        this.misMensajes = misMensajes;
    }

    public Collection<Relacion> getRelaciones() {
        return relaciones;
    }

    public void setRelaciones(Collection<Relacion> relaciones) {

        this.relaciones = relaciones;
    }

    public String getPerfil() {
        return perfil;
    }

    public String getSexo() {
        return sexo;
    }

    public String getApellidos() {
        return apellidos;
    }

    public Collection<SolicitudAmistad> getSolicitudesAmistadEnviadas() {
        return solicitudesAmistadEnviadas;
    }

    public Collection<SolicitudAmistad> getSolicitudesAmistadRecibidas() {
        return solicitudesAmistadRecibidas;
    }

    public String getContrasenya() {
        return contrasenya;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public String getEmail() {
        return email;
    }

    public Date getFechaAlta() {
        return fechaAlta;
    }

    public Date getFechaBaja() {
        return fechaBaja;
    }

    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    public int getIdUsuario() {
        return idUsuario;
    }

    public String getLema() {
        return lema;
    }

    public String getNombre() {
        return nombre;
    }

    public String getPoblacion() {
        return poblacion;
    }

    public String getProvincia() {
        return provincia;
    }

    public String getTipo() {
        return tipo;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setSexo(String Sexo) {
        this.sexo = Sexo;
    }

    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public void setContrasenya(String contrasenya) {
        this.contrasenya = contrasenya;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }

    public void setFechaBaja(Date fechaBaja) {
        this.fechaBaja = fechaBaja;
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }

    public void setLema(String lema) {
        this.lema = lema;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setPoblacion(String poblacion) {
        this.poblacion = poblacion;
    }

    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    /*se utiliza para para formatear fecha introducida de formulario*/

    public void setFormatoFechaNacimiento(String fecha) {
        this.setFechaNacimiento(UtilFecha.obtenerFecha(fecha));
    }

    // Persistencia
    public static List<Usuario> getListaAmigos(String nick) {
        return PersistenciaAmigos.consultaAmigos(nick);
    }

    public static Usuario devuelveUsuario(String nick) {
        return persistencia.PersistenciaUsuario.cargaUsuario(nick);
    }

    public void setAlta() {
        persistencia.PersistenciaUsuario.registrarUsuario(this);
    }

    public void setActualiza() {
        persistencia.PersistenciaUsuario.registrarUsuario(this);
    }

    public static void AltaUsuario(Usuario usu) {
        PersistenciaUsuario.registrarUsuario(usu);
    }

    public static void ActualizaUsuario(Usuario usu) {
        PersistenciaUsuario.actualizaUsuario(usu);
    }

    public static boolean esAmigo(String usu, String aux){
        return PersistenciaAmigos.EsAmigo(usu, aux);
    }
    public static boolean existeAmistad(String usu, String aux){
        return PersistenciaAmigos.existeAmistad(usu, aux);
    }
    /**
     * Comprueba si el usuario existe
     * @param nick
     * @return 
     */
    public static boolean compruebaUsuario(String nick) {
        return PersistenciaUsuario.existeUsuario(nick);
    }

    public static boolean compruebaContrasenna(String nick, String auxClave) {
        return PersistenciaUsuario.compruebaContrasenna(nick, auxClave);
    }

    public void cargarMensajes() {
        this.setMisMensajes(PersistenciaMensajes.recuperarMensajes(this.usuario));
    }

    public void addMsg(Mensaje msg) {
        if (msg != null) {
            this.misMensajes.add(msg);
            persistencia.PersistenciaMensajes.registraMsg(msg);
        }
    }

    public void addSubMsg(Mensaje msg, String idPadre) {

        Mensaje msgPadre = null;

        // añadirle al mensaje padre el submensaje        
        // recuperar antes lista de smensajes!
        // msgPadre.getSubMensajes().add(msg);

        // añadir mensaje a la tabla mensajes            
        persistencia.PersistenciaMensajes.registraMsg(msg);

        // recuperar mensaje padre por id
        msgPadre = persistencia.PersistenciaMensajes.recuperarMensajePorId(idPadre);
        
        // registrar relacion en tabla submensajes
        msg.setId(persistencia.PersistenciaMensajes.getMaxId());
        persistencia.PersistenciaMensajes.registrarSubMsg(msgPadre.getId(), msg.getId());

    }

    public void cargarRelaciones() {
        this.setRelaciones(PersistenciaAmigos.consultaRelaciones(this.usuario));
    }

    public void cargarInvitaciones() {
        this.setInvitaciones(PersistenciaInvitaciones.obtenerInvitacionesUsuario(this.usuario));
    }

    // Solicitudes de amistad
    public void enviarSolicitudAmistad(String usuario) {
        long lAhora = System.currentTimeMillis();
        Date d = new Date(lAhora);
        d.getTime();

        SolicitudAmistad solAmistad = new SolicitudAmistad(PersistenciaUsuario.cargaUsuario(usuario), d);

        this.solicitudesAmistadEnviadas.add(solAmistad);
        PersistenciaAmigos.insertarSolicitudAmistad(this, solAmistad);
        EnviarMail.envia(this.getNombre() + " " + this.getApellidos(), solAmistad.getUsuReceptor().getEmail(), email);
    }

    public void cargarSolicitudesAmistadEnviadas() {

        this.setSolicitudesAmistadEnviadas(PersistenciaAmigos.cargarSolicitudesAmistad(this.usuario, "enviadas"));
    }

    public void cargarSolicitudesAmistadRecibidas() {

        this.setSolicitudesAmistadRecibidas(PersistenciaAmigos.cargarSolicitudesAmistad(this.usuario, "recibidas"));
    }

    public void setSolicitudesAmistadEnviadas(Collection<SolicitudAmistad> solicitudesAmistad) {
        this.solicitudesAmistadEnviadas = solicitudesAmistad;
    }

    public void setSolicitudesAmistadRecibidas(Collection<SolicitudAmistad> solicitudesAmistad) {
        this.solicitudesAmistadRecibidas = solicitudesAmistad;
    }

    public int getNumSolicitudesAmistadRecibidas() {
        //return this.solicitudesAmistadRecibidas.size();
        int numSol = 0;
        for (SolicitudAmistad sa : this.solicitudesAmistadRecibidas) {
            if (sa.getEstado() == SolicitudAmistad.estadoSolicitudAmistad.PENDIENTE) {
                numSol++;
            }
        }
        return numSol;
    }

    public void aceptarSolicitudAmistad(String nick) {
        PersistenciaAmigos.aceptarSolicitudAmistad(nick, this.getUsuario());
        // Creo relacion de amistad
        PersistenciaAmigos.insertarAmistad(this.getUsuario(), nick);
        PersistenciaAmigos.insertarAmistad(nick, this.getUsuario());
        // Eliminar de la lista de solicitudes de amistad
        PersistenciaAmigos.bajaAmistad(nick);
    }

    public void rechazarSolicitudAmistad(String nick) {
    }

    // Invitaciones
    public void enviarSolicitudInvitacion(Invitacion inv) {
        PersistenciaInvitaciones.registraInvitacion(this, inv);
    }
    
    // Favoritos
    
    public List<Mensaje> cargarFavoritos(int idUsuario){
       return PersistenciaMensajes.devuelveFavoritos(idUsuario);
    }
}
